<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
    <title>Hello World!</title>
</head>
<body>
<#include "header.ftl" >
<p>
<#--
检测不存在的值： name?? 或者(user.name)??
name?? : name不为null或者存在
(bbb)!"0" : bbb不存在，默认0
<#if user.name??> <#if name??>
默认值被省略了，那么结果将会是空串，空序列或空哈希表。
-->
默认值省略:<br>
(${mouse1!})
<#assign mouse1 = "Jerry">
(${mouse1!})
<br>

指定默认值：<br>
${mouse!"No mouse."}
<#assign mouse="Jerry">
${mouse!"No mouse."}
<br>

默认值：序列<br>
<#assign seq = ['a', 'b']>
${seq[0]!'-'}
${seq[1]!'-'}
${seq[2]!'-'}
${seq[3]!'-'}

<br>
检测不存在的值:<br>
<#if name??>
    welcome ${name <#--comm0--> }  to freemarker!<br/>
    ${aaa!"default_a"}<br/>
    ${(bbb)!"0"}
</#if>
</p>

<#if ccc??>
welcome ${name}  to freemarker!<br/>
${aaa!"default_a"}<br/>
${(bbb)!"0"}
<#else>
no ccc
</#if>
</p>

<p>性别：
<#if gender==0 <#--comm1-->  >
    女
<#elseif gender==1>
    男
<#else>
    保密
</#if>
</p>
<#--comm2-->

<#--${server.port}-->
${ctx.contextPath}

<h4>我的好友：</h4>
<#list friends as item>
姓名：${item.name} , 年龄${item.age}
<br>
</#list>


<br/>
fruits[2]:${fruits[2]}
<br/>

<#--list 1to len-1 -->
<#list fruits[1..] as fruit>
myfruit：${fruit}+"oo"
<br>
</#list>

<br>
<#--用 start..end 定义存储数字范围的序列:list 0-1-->
seq_asc:<br>
<#list fruits[0..1] as fruit>
myfruit2：${fruit}
<br>
</#list>

<br>
seq_desc:<br>
<#list fruits[1..0] as fruit>
myfruit2：${fruit}
<br>
</#list>


<br/>
(${x} * 1.5 + 10) / 2 - ${y} % 100 : ${(x * 1.5 + 10) / 2 - y % 100}

<br/>

${"\l,\g,\a,\n,\\,\', "}
<br>
${r"${foo}"}
<br>
${r"C:\foo\bar"}

<br/>
<br/>
sequence:<br>
<#list ["winter", "spring", "summer", "autumn"] as x>
${x}<br>
</#list>

<br/>
算数运算：
<br/>
${100 - x*x}
${x/2}
${12%10}
${3 + 5}
${3 + "5"}
<br>
${(x/2)?int}
${1.1?int}
${1.999?int}
${-1.1?int}
${-1.999?int}
<br/>
<#--=或!=两边的表达式的结果都必须是标量，而且两个标量都必须是相同类型-->

<#-- && ,|| ,!-->
比较运算：<br/>
<#if x <= 12 && (y>1)>
x is less or equivalent with 12,y more 1
</#if>

<#--。 FreeMarker 解释>的时候可以把它当作 FTL 标签的结束符。为了避免这种问题，不得不将表达式放到括号内： <#if (x > y)>-->
<#if (x >= 12) >
x is more or equivalent with 12
</#if>

<br/>

括号：<br>
<#-- 输出是: -->
${3 * 2 + 2} <#-- 8 -->
${3 * (2 + 2)} <#-- 12 -->
${3 * ((2 + 2) * (1 / 2))} <#-- 6 -->
${"Green " + "mouse"?upper_case} <#-- green MOUSE -->
${("Green " + "mouse")?upper_case} <#-- GREEN MOUSE -->
${("Green " + "mouse")?lower_case} <#-- GREEN MOUSE -->

<#--<#if !( color = "red" || color = "green")>-->
<#--The color is nor red nor green-->
<#--</#if>-->
<br>
<#--使用内建函数 string 来将布尔值转换为字符串形式-->
${(1=1)?string("yes","no")}-
${(1=2)?string("yes","no")}
 <br>


assign指令：<br>
${mouse!"No mouse."}
<#assign mouse="Jerry">
${mouse!"No mouse."}
<br><br>

macro指令：<br>
<#macro greet>
<font size="+2">Hello Joe!</font>
</#macro>
<@greet></@greet> ,
<@greet/>
<br>

<#--在 macro 指令中，宏名称的后面位置是用来定义变量的-->
<#macro greet2 person>
<font size="+2">Hello ${person}!</font>
</#macro>
<@greet2 person="g2"/>
<br>

<#macro greet3 person color>
<font size="+2" color="${color}">Hello ${person}!</font>
</#macro>
<@greet3 person="Fred" color="blue"/>,
<@greet3 color="green" person="Fred"/>

<br>
<#macro greet4 person color="red">
<font size="+2" color="${color}">Hello ${person}!</font>
</#macro>
<@greet4 person="Juli"/>
<br>

<#--嵌套指令 nested-->
嵌套内容：<br>
<#macro border>
<table border=4 cellspacing=0 cellpadding=4><tr><td>
    <#nested>
</td></tr></table>
</#macro>
<@border>The bordered text</@border>

<br>
<#macro do_thrice>
    <#nested>
    <#nested>
    <#nested>
</#macro>

<@do_thrice>
Anything.
</@do_thrice>
<br>

<#--嵌套的内容可以是任意有效的 FTL，包含其他的用户自定义指令，-->

<@border>
<ul>
    <@do_thrice>
    <li><@greet2 person="Hali"/>
    </@do_thrice>
</ul>
</@border>

<br>
<#--在嵌套的内容中，宏的局部变量从宏外部定义是不可见的。 -->
<#macro repeat count>
    <#local y1 = "test">
    <#list 1..count as x2>
    ${y1} ${count}/${x2}: <#nested>
    </#list>
</#macro>
<@repeat count=3>${y1!"?"} ${x1!"?"} ${count!"?"}<br></@repeat>

<br>
<#--不同的局部变量的设置是为每个宏自己调用的，所以不会导致混乱：-->
<#macro test foo>
    ${foo} (<#nested>) ${foo}
</#macro>
<@test foo="A"><@test foo="B"><@test foo="C"/></@test></@test>
<br>

宏和循环变量:<br>
<#macro do_thrice>
    <#nested 1>
    <#nested 2>
    <#nested 3>
</#macro>
<@do_thrice ; x3> <#-- 用户自定义指令 使用";"代替"as" -->
${x3} Anything.<br>
</@do_thrice>
<br>

<#macro repeat count>
    <#list 1..count as x4>
        <#nested x4, x4/2, x4==count>
    </#list>
</#macro>
<#--在自定义指令的开始标签（分号之后）为循环变量指定不同的数字是没有问题的，而不
能在 nested 指令上使用。如果在分号之后指定的循环变量少，那么就看不到 nested
指令提供的最后的值，因为没有循环变量来存储这些值，下面的这些都是可以的：-->
<@repeat count=4 ; c, halfc, last>
${c}. ${halfc}<#if last> Last!</#if><br>
</@repeat>

------------<br>
<@repeat count=4 ; c, halfc>
${c}. ${halfc}<br>
</@repeat>
-----------<br>
<@repeat count=4>
Just repeat it...<br>
</@repeat>
------------

<br>
<#--
简单变量：能从模板中的任何位置来访问,可以使用 assign 或 macro 指令来创建或替换这些变量
局部变量:只能被设置在宏定义体内，而且只在宏内可见。(宏的参数)
循环变量：由指令（如 list）自动创建的，而且它们只在指令的开始和结束标记内有效
-->
在模板中定义变量:<br>

name:${name}<br>
<#--模板里定义的变量，比定义在数据模型中的同名参数有更高的优先级
有时会发生一个变量隐藏数据模型中的同名变量，但是如果想访问数据模型中的变量，就可以使用特殊变量 globals。
-->
<#assign name="KKK"/>
name:${name}
<br>
globals_name:${.globals.name}
<br>

<#assign x5 = 1> <#-- 创建变量 x -->
${x5}
<#assign x5 = x5 + 3> <#-- 替换变量 x -->
${x5}

<#--局部变量也会隐藏（不是覆盖）同名的简单变量。循环变量也会隐藏（不是覆盖）同名的局部变量和简单变量。-->

<br>
<#assign x6 = "plain">
1. ${x6} <#-- 这里是普通变量 -->
<@mytest/>
6. ${x6} <#-- 普通变量的值没有被改变 -->
<#list ["loop"] as x6>
7. ${x6} <#-- 现在循环变量隐藏了普通变量 -->
    <#assign x6 = "plain2"> <#-- 替换普通变量, 隐藏在这里不起作用-->
8. ${x6} <#-- 它仍然隐藏普通变量 -->
</#list>
9. ${x6} <#-- 普通变量的 新值  -->

<#macro mytest>
2. ${x6} <#-- 这里我们仍然看到的是普通变量 -->
    <#local x6 = "local">
3. ${x6} <#-- 现在局部变量隐藏了它 -->
    <#list ["loop"] as x6>
    4. ${x6} <#-- 现在循环变量隐藏了局部变量 -->
    </#list>
5. ${x6} <#-- 现在又可以看到局部变量了 -->
</#macro>

<br>
内部循环变量可以隐藏外部循环变量:<br>
<#list ["loop 1"] as x7>
${x7}
    <#list ["loop 2"] as x7>
    ${x7}
        <#list ["loop 3"] as x7>
        ${x7}
        </#list>
    ${x7}
    </#list>
${x7}
</#list>
<br>

<#--import 指令不仅仅创建命名空间，而且要通过 import 的调用者（本例中的主命名空间）创建一个新的哈希表变量-->
命名空间:<br>
<#import "./lib/my_test.ftl" as my>
<#assign mail="fred@acme.com">
<#-- 被称为"my"的哈希表就会是那个"大门" -->
<@my.copyright date="1999-2002"/>
1 my.mail=${my.mail}<br>
2 mail=${mail}
<br>



命名空间和数据模型:<br>
在引入的命名空间上编写变量:<br>
my.mail=${my.mail}<br>
<#assign mail="jsmith@other.com" in my>
my.mail=${my.mail}

<br>
<#--
数据模型中的变量在任何位置都是可见的
在模板的命名空间（可以使用 assign 或 macro 指令来创建的变量）中的变量
有着比数据模型中的变量更高的优先级。因此，数据模型的内容不会干涉到由库创建的变量
多次 import 这个路径，那么只会为第一次的 import 引用创建命名空间执行模板。 后面相同路径的 import
只是创建一个哈希表当作访问相同命名空间的“门”。
命名空间是不分层次的，它们相互之间是独立存在的。
-->

<#import "./lib/my_test.ftl" as my2>
<#import "./lib/my_test.ftl" as foo2>
<#import "./lib/my_test.ftl" as bar2>
${my2.mail}, ${foo2.mail}, ${bar2.mail}
<#assign mail="jsmith@other.com" in my>
${my2.mail}, ${foo2.mail}, ${bar2.mail}
<br>

空白处理：<br>
<p>List of users:


<#--<#compress single_line=true>-->

<#compress>
 <#assign users = [{"name":"Joe", "hidden":false},
    {"name":"James Bond", "hidden":true},
    {"name":"Julia", "hidden":false}]>
<ul>
    <#list users as user>
        <#if !user.hidden>
        <li>${user.name}<br>
        </#if>
    </#list>
</ul>
<p>That's all.
</#compress>

<br>

<br>now：返回当前的时间日期 :<br>
Page generated:${.now}",<BR>
    "Today is ${.now?date}",<BR>
    "The current time is${.now?time}"。<BR>
mdate  : ${.now?string("yyyyMMdd HH:mm:ss")}


    <#--data_model:${.data_model}<br>-->
    version:${.version}<br>
    lang:${.lang}<br>
    locale:${.locale}<br>
    version:${.version}<br>
    <#--node:${.node}<br>-->
    <#--namespace:${.namespace}<br>-->
    template_name:${.template_name}<br>
    <#--url_escaping_charset:${.url_escaping_charset}<br>-->
<br>
 <#include "footer.ftl" >
<#--<#include "footer.ftl" >-->
</body>
</html>